﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//int main()
//{
//	int a[3][4] = { 0 };
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof(a[0][0]));
//	printf("%d\n", sizeof(a[0]));
//	printf("%d\n", sizeof(a[0] + 1));
//	printf("%d\n", sizeof(*(a[0] + 1)));
//	printf("%d\n", sizeof(a + 1));
//	printf("%d\n", sizeof(*(a + 1)));
//	printf("%d\n", sizeof(&a[0] + 1));
//	printf("%d\n", sizeof(*(&a[0] + 1)));
//	printf("%d\n", sizeof(*a));
//	printf("%d\n", sizeof(a[3]));
//	return 0;
//}

//int main()
//{
//	int a[5] = { 1, 2, 3, 4, 5 };
//	int* ptr = (int*)(&a + 1);
//	printf("%d,%d", *(a + 1), *(ptr - 1));
//	return 0;
//}

////在X86环境下
////假设结构体的⼤⼩是20个字节
////程序输出的结构是啥？
//struct Test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p = (struct Test*)0x100000;
//
//
//int main()
//{
//	printf("%p\n", p + 0x1);
//	printf("%p\n", (unsigned long)p + 0x1);
//	printf("%p\n", (unsigned int*)p + 0x1);
//	return 0;
//}
//
//int main()
//{
//	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
//	int* p;
//	p = a[0];
//	printf("%d", p[0]);
//	return 0;
//}

////假设环境是x86环境，程序输出的结果是啥？
//int main()
//{
//	int a[5][5];
//	int(*p)[4];
//	p = a;
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//	return 0;
//}

//int main()
//{
//	int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int* ptr1 = (int*)(&aa + 1);
//	int* ptr2 = (int*)(*(aa + 1));
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}
//
//int main()
//{
//	char* a[] = { "work","at","alibaba" };
//	char** pa = a;
//	pa++;
//	printf("%s\n", *pa);
//	return 0;
//}
//
//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3,c + 2,c + 1,c };
//	char*** cpp = cp;
//	printf("%s\n", **++cpp);
//	printf("%s\n", *-- * ++cpp + 3);
//	printf("%s\n", *cpp[-2] + 3);
//	printf("%s\n", cpp[-1][-1] + 1);
//	return 0;
//}

#include<ctype.h>
//int main()
//{
//	//int ret = islower('a');
//	//printf("%d\n", ret);
//
//	int ret = isspace('A');
//	int ret2 = isspace(' ');
//	printf("%d\n", ret);
//	printf("%d\n", ret2);
//	return 0;
//}
//
//int main()
//{
//	char arr[] = "I am a student";
//	//I am a student\0
//	//0123...
//	int i = 0;
//	while (arr[i] != '\0')
//	{
//		if (arr[i] >= 'a' && arr[i] <= 'z')
//		{
//			arr[i] -= 32;
//		}
//		i++;
//	}
//	printf("%s\n", arr);
//	return 0;
//}

//int main()
//{
//	printf("%c\n", toupper('a'));
//	printf("%c\n", toupper('B'));
//	printf("%c\n", tolower('c'));
//	printf("%c\n", toupper('C'));
//	return 0;
//}
//
//int main()
//{
//	char arr[] = "I am a student";
//	//I am a student\0
//	//0123...
//	int i = 0;
//	while (arr[i] != '\0')
//	{
//		if (islower(arr[i]))
//		{
//			arr[i] = toupper(arr[i]);
//		}
//		i++;
//	}
//	printf("%s\n", arr);
//	return 0;
//}
//
//#include<string.h>
//int main()
//{
//	if (strlen("abc") - strlen("abcdef")>0)
//	{
//		printf(">\n");
//	}
//	else
//		printf("<=\n");
//	return 0;
//}

#include<assert.h>
////计数器的版本
//size_t my_strlen(const char* s)
//{
//	assert(s);
//	int count = 0;
//	while (*s != '\0')
//	{
//		count++;
//		s++;
//	}
//	return count;
//}
//
////不创建临时变量求字符串的长度 --递归
//size_t my_strlen(const char* s)
//{
//	if (*s == '\0')
//	{
//		return 0;
//	}
//	else
//		return 1 + my_strlen(s + 1);
//}
//int main()
//{
//	char arr[] = "abcdef";
//
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}
//#include<string.h>
//int main()
//{
//	char arr1[] = "hello bit";
//	char arr2[20] = { 0 };
//	strcpy(arr2, arr1);
//	printf("%s\n", arr1);
//	printf("%s\n", arr2);
//	return 0;
//}
//
//char* my_strcpy(char* dest, const char* src)
//{
//	char* ret = dest;
//	assert(src != NULL);
//	assert(dest != NULL);
//	//拷贝\0之前的内容
//	while (*dest = *src)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[] = "hello bit";
//	char arr2[20] = {"xxxxxxxxxxxxxxxx"};
//	
//	my_strcpy(arr2, arr1);
//	printf("%s\n", arr2);
//	return 0;
//}

#include<string.h>
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "bit";
//	strcat(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}

char* my_strcat(char* dest,  const char* src)
{
	assert(dest != NULL && src != NULL);
	char* ret = dest;
	//找到目标空间的\0
	while (*dest != '\0')
	{
		dest++;
		
	}
	//拷贝
	while (*dest++ = *src++)
		;
	return ret;
}
int main()
{
	char arr1[20] = "hello_";
	char arr2[] = "bit";
	char* s = my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	printf("%s\n", my_strcat(arr1, arr2));
	printf("%s\n", s);
	return 0;
}